import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
  Request,
} from '@nestjs/common';
import { ArticlesService } from './articles.service';
import { CreateArticleDto } from './dto/create-article.dto';
import { UpdateArticleDto } from './dto/update-article.dto';
import { QueryArticlesDto } from './dto/query-articles.dto';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { Roles } from '../../common/decorators/roles.decorator';
import { Role } from '../../common/decorators/roles.decorator';
import { RolesGuard } from '../../common/guards/roles.guard';

@Controller('articles')
export class ArticlesController {
  constructor(private readonly articlesService: ArticlesService) {}

  /**
   * 创建文章（仅编辑及以上）
   */
  @Post()
  @Roles(Role.ADMIN, Role.SUPER_ADMIN, Role.EDITOR)
  @UseGuards(JwtAuthGuard, RolesGuard)
  create(@Request() req, @Body() createArticleDto: CreateArticleDto) {
    return this.articlesService.create(req.user.userId, createArticleDto);
  }

  /**
   * 获取文章分类列表（公开）
   */
  @Get('categories')
  getCategories() {
    return this.articlesService.getCategories();
  }

  /**
   * 获取文章标签列表（公开）
   */
  @Get('tags')
  getTags() {
    return this.articlesService.getTags();
  }

  /**
   * 获取精选文章（公开）
   */
  @Get('featured')
  getFeatured(@Query('limit') limit?: number) {
    return this.articlesService.getFeatured(limit);
  }

  /**
   * 查询文章列表（公开，但草稿仅作者和管理员可见）
   */
  @Get()
  findAll(@Query() query: QueryArticlesDto, @Request() req) {
    const userId = req.user?.userId;
    return this.articlesService.findAll(query, userId);
  }

  /**
   * 获取相关文章（公开）
   */
  @Get(':id/related')
  getRelated(@Param('id') id: string, @Query('limit') limit?: number) {
    return this.articlesService.getRelated(+id, limit);
  }

  /**
   * 查询单个文章（公开）
   */
  @Get(':slug')
  findOne(@Param('slug') slug: string) {
    return this.articlesService.findBySlug(slug);
  }

  /**
   * 更新文章（仅作者和管理员）
   */
  @Patch(':id')
  @Roles(Role.ADMIN, Role.SUPER_ADMIN, Role.EDITOR)
  @UseGuards(JwtAuthGuard, RolesGuard)
  update(@Param('id') id: string, @Body() updateArticleDto: UpdateArticleDto) {
    return this.articlesService.update(+id, updateArticleDto);
  }

  /**
   * 删除文章（仅管理员）
   */
  @Delete(':id')
  @Roles(Role.ADMIN, Role.SUPER_ADMIN)
  @UseGuards(JwtAuthGuard, RolesGuard)
  remove(@Param('id') id: string) {
    return this.articlesService.remove(+id);
  }

  /**
   * 点赞文章（需要登录）
   */
  @Post(':id/like')
  @UseGuards(JwtAuthGuard)
  likeArticle(@Param('id') id: string) {
    return this.articlesService.incrementLikes(+id);
  }
}
